package com.dreamthen.interceptor;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Parameter;
import java.util.Arrays;

/**
 * 1、实现HandlerInterceptor接口，根据具体业务实现相应的接口
 *
 * @Author zengms
 * @Date 2023-11-09 21:26:07
 **/
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 处理方法执行之前执行：登录，日志
     *
     * @param request  方法执行前可以修改请求参数(可以在方法执行前更改request中的属性值)
     * @param response
     * @param handler  具体执行方法，方法名称、参数、具体类信息(封装了当前处理方法的信息（可以获取当前是哪个方法，及响应的参数）)
     * @return false：设置true：代表后续拦截器调用继续执行，如果是false就会终端，终止后面的执行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Controller controller = handlerMethod.getBean().getClass().getAnnotation(Controller.class);
            GetMapping getMapping = handlerMethod.getMethod().getAnnotation(GetMapping.class);
            String className = handlerMethod.getBean().getClass().getName();
            String methodName = handlerMethod.getMethod().getName();
            Parameter[] parameters = handlerMethod.getMethod().getParameters();
            System.out.println("****className=" + className);
            System.out.println("****controller-value=" + controller);
            System.out.println("****getMapping-name=" + getMapping);
            System.out.println("*****methodName=" + methodName);
            System.out.println("******parameters=" + Arrays.asList(parameters));
        }
        System.out.println("*****MyFirstInterceptor-preHandle****");
        return true;
    }

    /**
     * 处理方法执行之后执行
     *
     * @param request
     * @param response     方法执行执行之后可以修改response中的信息，比如重定向，在头部加一些信息
     * @param handler      封装了当前处理方法的信息（可以获取当前是哪个方法，及响应的参数）
     * @param modelAndView 封装了model和view，可以在请求方法执行后修改view或者model里面的信息，比如修改视图跳转，修改model里面数据或者新增model数据
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("*****MyFirstInterceptor-postHandle****");
    }

    /**
     * 处理方法执行完毕（结束）执行的方法——视图渲染之后，相当于finally{}里面执行，
     * 如果preHandle返回true时，这个方法一定会执行，返回false则不会执行该方法，出现异常也一定会执行该方法
     *
     * @param request
     * @param response
     * @param handler
     * @param ex       Exception对象，在改方法中记录异常日志的功能，或者清楚资源，比如需要关闭的一些对象，因为当前方法相当于finally
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("*****MyFirstInterceptor-afterCompletion****");
    }
}
